Cubemosの骨格検知SDKとRealSenseを使って人が棚に手を伸ばしたことを検知してみた
Cubemosの骨格検知SDK1をIntelのRealSense2と組み合わせて使用すると、人体の骨格(姿勢)情報を三次元で得ることができます。 この三次元の骨格情報を使用して、人が棚に手を伸ばしたことを検知してみました。
どうやって実現するか
複数の人が同時に棚に手を伸ばしているところを検知したいので、天井に近い位置から人間を見下ろす向きに設置したRealSenseの映像でcubemos骨格検知を実行し、 検知された手首の座標から手の位置を推定します。
ハードウェアとソフトウェアの準備
ハードウェア
- Windows10がインストールされたPC
- Intel RealSense D435i
RealSenseは、市販の突っ張り棒を利用して手伸ばしを検出したい棚をほぼ真上から見下ろす位置の天井付近に設置しました。
ソフトウェア
- cubemosのSkeleton Tracking SDKとIntel RealSense SDK2.0
- それぞれ公式サイトからダウンロードしてWindowsマシンにインストールします
- python 3.7
- cubemosとRealSense両方にPythonラッパーが提供されていたので、実験用プログラムはPythonで作成しました
- cubemos SDKはPython 3.6以上に対応していますが、3.8ではcubemosパッケージのインポート時にエラーが発生したので3.7を使用しました
各SDKのインストールと基本的な動作確認や使用するPythonのバージョンについては、せーのさんのブログ345により詳細な情報が記載されてます。
手伸ばし検知の概要
cubemos Skeleton Tracking SDKによる骨格検知
cubemosの骨格検知では、入力されたRGB画像中に存在する人一人に対して、最大で18箇所のポイント(キーポイント)を検出します。 18箇所の内訳は、以下のとおりです:
実際のRGB画像に対して骨格検知を行い、結果を画像上にプロットしてみました。キーポイント毎に、推論結果の信頼度(confidence)が付与されるので、信頼度のレンジによってプロットする色を変えてあります。
手首の床からの高さの計算
cubemosが出力した手首の座標における深度情報(depth)を使用して、下図のような計算式から手首の床からの高さを算出します。 カメラの床からの高さと、カメラが床と平行な面となす角度は事前に測定しておきます。
手先の位置の算出
cubemosが推定してくれるのは、手首の関節の座標までです。 手先の位置は、肘と手首の関節を結ぶ直線を手首:肘=1:4で外分する点6として機械的に算出しました。
棚に手を入れたことの判定
手首の床からの高さと手先の位置を統合して、棚のどこに手が入ったかを判定します。
動作確認
RealSense D435iのRGB+depth画像に対して連続的にcubemosの骨格検知を実行しながら、棚への手伸ばし検知を実行した際の動画です。
Top view hand position detection using the cubemos skeleton tracking SDK with Intel RealSense D435i - YouTube
まとめ
骨格検知で正確に手首の座標が取得できている時には、棚への手伸ばし判定も概ね正確にできました。 一方、以下のような場合には正確な座標が取得できないことがあったので、こういう状況においても正確に手伸ばし判定ができるような対策を検討していきます。
- 複数の人が接近している時
- 人がしゃがんだり、中腰になった時
参考情報
- cubemos Skeleton Tracking SDK ↩
- Intel RealSense D435i ↩
- Intel RealSenseに待望のSkeleton Tracking SDKが出た(cubemos製)ので触ってみた[Windows編] | Developers.IO ↩
- Skeleton Tracking SDKのPython版サンプルのコードを読んでみた[Windows編] | Developers.IO ↩
- Intel RealSense D435iとSkeleton Tracking SDKを連携させたら簡単だったのでコードを読んでみた[Windows編] | Developers.IO ↩
- 内分点,外分点の公式と証明 | 高校数学の美しい物語 ↩